package br.edu.com1263.action;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;

import br.edu.com1263.dto.TarefaDTO;
import br.edu.com1263.dto.TurmaDTO;
import br.edu.com1263.model.Paradigma;
import br.edu.com1263.model.Professor;
import br.edu.com1263.model.StatusTarefa;
import br.edu.com1263.model.Tarefa;
import br.edu.com1263.model.Turma;
import br.edu.com1263.negocio.AlunoFacade;
import br.edu.com1263.negocio.ParadigmaFacade;
import br.edu.com1263.negocio.ProfessorFacade;
import br.edu.com1263.negocio.TarefaFacade;
import br.edu.com1263.negocio.TurmaFacade;

public class TarefaAction extends MainAction{

	/**
	 * 
	 */
	private static final long serialVersionUID = -8802792203289478089L;
	private TarefaFacade tarefaFacade;
	private ParadigmaFacade paradigmaFacade;
	private ProfessorFacade professorFacade;
	private AlunoFacade alunoFacade;
	private TurmaFacade turmaFacade;

	private String editar;
	private String remover;
	private String adicionar;
	private String consultar;
	private String menu;
	private String nomeProfessor;


	private String codTarefa;
	private String nomeTarefa;
	private String descricaoTarefa;
	private Date inicio;
	private Date termino;
	private StatusTarefa status;


	Long id;
	private Long idTurma;
	private Long idProfessor;
	private Collection<Professor> professors = null;
	private Collection<TarefaDTO> tarefas = null;
	private Collection<Paradigma> paradigmas = null;
	private Long idTarefa;
	private Collection<Paradigma> meusParadigmas = null;
	private Collection<Long> paradigmasSelecionados = null;
	private Collection<TurmaDTO> turmas = null;


	public TarefaAction(TarefaFacade tarefaFacade,
			ParadigmaFacade paradigmaFacade, ProfessorFacade professorFacade, 
			TurmaFacade turmaFacade, AlunoFacade alunoFacade) {

		this.tarefaFacade = tarefaFacade;
		this.paradigmaFacade = paradigmaFacade;
		this.professorFacade = professorFacade;
		this.turmaFacade = turmaFacade;
		this.alunoFacade = alunoFacade;
	}

	//----------------------------------------------------
	//					Acoes
	//----------------------------------------------------	
	@Override
	public String execute() throws Exception {
		clearErrorsAndMessages();

		if(adicionar != null){
			adicionar = null;
			Tarefa tarefa = new Tarefa(codTarefa, nomeTarefa, descricaoTarefa, inicio, termino);

			Turma turma =  turmaFacade.consultar(idTurma);

			Collection<Paradigma> listaAuxiliar = new ArrayList<Paradigma>();
			if (paradigmasSelecionados != null)
			{
				for (Long idParadigma : paradigmasSelecionados)
				{
					System.out.println("IdParadigma: " + idParadigma);
					Paradigma p = paradigmaFacade.consultar(idParadigma);
					listaAuxiliar.add(p);
				}
			}
			tarefa.setStatus(StatusTarefa.DATA_ATIVA);
			tarefa.setTurma(turma);
			
			tarefa.setParadigmas(listaAuxiliar);
			tarefaFacade.salvar(tarefa);
			
			montarTarefas(recuperarProfessorAtualizado());
			addActionMessage("A Tarefa foi adicionada corretamente.");
			return "view";
		}

		if(consultar != null){
			consultar = null;
			if (idTarefa == null)
			{
				addActionMessage("Uma Tarefa deve ser selecionada.");
				return "view";
			}
			Tarefa t = tarefaFacade.consultar(idTarefa);
			if (t != null)
			{
				id = t.getId();
				codTarefa = t.getCodTarefa();
				nomeTarefa = t.getNomeTarefa();
				descricaoTarefa = t.getDescricaoTarefa();
				Collection<Paradigma> paradigmas = t.getParadigmas();
				paradigmasSelecionados = new ArrayList<Long>();
				idTurma = t.getTurma().getId();
				if (paradigmas != null)
				{
					for (Paradigma p : paradigmas)
					{
						System.out.println("IdParadigma: " + p.getId());            		         	
						paradigmasSelecionados.add(p.getId());
					}         	  
				}
			}
			return "view";
		}

		if(editar != null){
			editar = null;
			Turma turma = turmaFacade.consultar(idTurma);
			Tarefa t = tarefaFacade.consultar(id);
			
			t.setCodTarefa(codTarefa);
			t.setNomeTarefa(nomeTarefa);
			t.setDescricaoTarefa(descricaoTarefa);
			t.setId(id);
			t.setTurma(turma);
			
			tarefaFacade.alterar(t);
			
			montarTarefas(recuperarProfessorAtualizado());
			addActionMessage("A Tarefa foi editada corretamente.");
			return "view";
		}

		if(remover != null){
			remover = null;
			
			Tarefa t = tarefaFacade.consultar(idTarefa);
			if (t != null)
			{
				tarefaFacade.remover(t);
			}
			montarTarefas(recuperarProfessorAtualizado());
			addActionMessage("A Tarefa foi removida corretamente.");
			return "view";
		}
		
		if(menu != null){
			menu = null;
			return "menu";
		}
		return "menu";
	}

	public String cadastraTarefa() throws Exception{
		Professor professor = recuperarProfessorAtualizado();
		
		nomeProfessor = professor.getNome();
		idProfessor = professor.getId();

		montarTarefas(professor);
		
		Collection<Turma> aux = turmaFacade.consultarProfessor(professor.getId());
		turmas = new HashSet<TurmaDTO>();
		if (aux != null)
		{
			for (Turma turma : aux)
			{
				TurmaDTO dto = new TurmaDTO();
				dto.setIdTurma(turma.getId());
				dto.setNome(turma.getDisciplina().getCodDisciplina() + " - " + turma.getCodTurma());
				turmas.add(dto);
			}
		}
		
		meusParadigmas = professor.getParadigmas();
		professors = professorFacade.consultarTodos();

		inicio = new Date();
		termino = new Date();
		return "view";
	}

	
	
	private void montarTarefas(Professor professor)
	{
		tarefas = new HashSet<TarefaDTO>();
		if (professor.getTurmas() != null)
		{
			for (Turma turma : professor.getTurmas())
			{
				if (turma.getTarefas() != null)
				{
					for (Tarefa tarefa : turma.getTarefas())
					{
						TarefaDTO dto = new TarefaDTO();
						dto.setIdTarefa(tarefa.getId());
						dto.setNome(turma.getDisciplina().getCodDisciplina() + " " + turma.getCodTurma() + " " + tarefa.getNomeTarefa());
						tarefas.add(dto);
					}
				}				
			}
		}
	}
	//	--------------------------------------------------
	//	Gets e sets
	//----------------------------------------------------


	public TarefaFacade getTarefaFacade() {
		return tarefaFacade;
	}

	public void setTarefaFacade(TarefaFacade tarefaFacade) {
		this.tarefaFacade = tarefaFacade;
	}

	public ParadigmaFacade getParadigmaFacade() {
		return paradigmaFacade;
	}

	public void setParadigmaFacade(ParadigmaFacade paradigmaFacade) {
		this.paradigmaFacade = paradigmaFacade;
	}

	public ProfessorFacade getProfessorFacade() {
		return professorFacade;
	}

	public void setProfessorFacade(ProfessorFacade professorFacade) {
		this.professorFacade = professorFacade;
	}

	public String getEditar() {
		return editar;
	}

	public void setEditar(String editar) {
		this.editar = editar;
	}

	public String getRemover() {
		return remover;
	}

	public void setRemover(String remover) {
		this.remover = remover;
	}

	public String getAdicionar() {
		return adicionar;
	}

	public void setAdicionar(String adicionar) {
		this.adicionar = adicionar;
	}

	public String getConsultar() {
		return consultar;
	}

	public void setConsultar(String consultar) {
		this.consultar = consultar;
	}

	public String getMenu() {
		return menu;
	}

	public void setMenu(String menu) {
		this.menu = menu;
	}

	public String getCodTarefa() {
		return codTarefa;
	}

	public void setCodTarefa(String codTarefa) {
		this.codTarefa = codTarefa;
	}

	public String getNomeTarefa() {
		return nomeTarefa;
	}

	public void setNomeTarefa(String nomeTarefa) {
		this.nomeTarefa = nomeTarefa;
	}

	public String getDescricaoTarefa() {
		return descricaoTarefa;
	}

	public void setDescricaoTarefa(String descricaoTarefa) {
		this.descricaoTarefa = descricaoTarefa;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getTermino() {
		return termino;
	}

	public void setTermino(Date termino) {
		this.termino = termino;
	}

	public StatusTarefa getStatus() {
		return status;
	}

	public void setStatus(StatusTarefa status) {
		this.status = status;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Long getIdProfessor() {
		return idProfessor;
	}

	public void setIdProfessor(Long idProfessor) {
		this.idProfessor = idProfessor;
	}

	public Collection<Professor> getProfessors() {
		return professors;
	}

	public void setProfessors(Collection<Professor> professors) {
		this.professors = professors;
	}

	public Collection<TarefaDTO> getTarefas() {
		return tarefas;
	}

	public void setTarefas(Collection<TarefaDTO> tarefas) {
		this.tarefas = tarefas;
	}

	public Collection<Paradigma> getParadigmas() {
		return paradigmas;
	}

	public void setParadigmas(Collection<Paradigma> paradigmas) {
		this.paradigmas = paradigmas;
	}

	public Long getIdTarefa() {
		return idTarefa;
	}

	public void setIdTarefa(Long idTarefa) {
		this.idTarefa = idTarefa;
	}

	public Collection<Paradigma> getMeusParadigmas() {
		return meusParadigmas;
	}

	public void setMeusParadigmas(Collection<Paradigma> meusParadigmas) {
		this.meusParadigmas = meusParadigmas;
	}

	public Collection<Long> getParadigmasSelecionados() {
		return paradigmasSelecionados;
	}

	public void setParadigmasSelecionados(
			Collection<Long> paradigmasSelecionados) {
		this.paradigmasSelecionados = paradigmasSelecionados;
	}

	public String getNomeProfessor() {
		return nomeProfessor;
	}

	public void setNomeProfessor(String nomeProfessor) {
		this.nomeProfessor = nomeProfessor;
	}

	public Collection<TurmaDTO> getTurmas() {
		return turmas;
	}

	public void setTurmas(Collection<TurmaDTO> turmas) {
		this.turmas = turmas;
	}

	public TurmaFacade getTurmaFacade() {
		return turmaFacade;
	}

	public void setTurmaFacade(TurmaFacade turmaFacade) {
		this.turmaFacade = turmaFacade;
	}

	public Long getIdTurma() {
		return idTurma;
	}

	public void setIdTurma(Long idTurma) {
		this.idTurma = idTurma;
	}


	public AlunoFacade getAlunoFacade() {
		return alunoFacade;
	}

	public void setAlunoFacade(AlunoFacade alunoFacade) {
		this.alunoFacade = alunoFacade;
	}
}
